<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<body>
		<script type="text/javascript">
			//执行环境定义了变量或函数有权访问的其他数据
			
			//1.每个执行环境都有一个与之关联的变量对象（variable object），执行环境中定义的所有变量和函数都保存在这个变量对象中
			//  我们编写的代码无法访问这个变量对象，但解析器在处理数据时会在后台使用它
			
			//2.全局执行环境是最外围的一个执行环境
			//  在 Web 浏览器中，全局执行环境被认为是 window 对象，因此所有全局变量和函数都是作为 window 对象的属性和方法创建的。
			
			//3.每个函数都有自己的执行环境。
			//  当执行流进入一个函数时，函数的执行环境就会被推入一个环境栈中。而在函数执行之后，栈将其执行环境弹出，把控制权返回给之前的执行环境
			
		    //4.当代码在一个环境中执行时，会创建变量对象的一个作用域链（scope chain）
		    //  作用域链的用途，是保证对执行环境有权访问的所有变量和函数的有序访问
		    //  作用域链的前端，始终都是当前执行的代码所在执行环境的变量对象。如果这个环境是函数，则将其活动对象（activation object）作为变量对象
		    //  全局执行环境的变量对象始终都是作用域链中的最后一个对象。
		    //  函数参数也被当作变量来对待，因此其访问规则与执行环境中的其他变量相同。
					    var color = "blue";
					    function changeColor(){
					    	if(color==="blue"){
					    		color="red";
					    	}else{
					    		color="blue";
					    	}
					    }
					    changeColor();
					    console.log("Color is now " + color);

			            var color = "blue"
			            function changeColor(){
			            	var anotherColor = "red";
			            	function swapColors(){
			            		var tempColor = anotherColor;
			            		anotherColor = color;
			            		color = tempColor;
			            	    //这里可以访问color、anotherColor、tempColor
			            	    console.log(color,anotherColor,tempColor);//red blue red
			            	}
			            	//这里可以访问color和anotherColor，但不能访问tempColor
			            	console.log(color,anotherColor);//blue red
			            	console.log(tempColor);//报错
			            	swapColors();
			            }
			            //这里只能访问color
			            changeColor();
			            console.log(color);//red
			            console.log(anotherColor);//报错
			            console.log(tempColor);//报错
			
            //4.2.1  延长作用域链
            //4.2.2  没有块级作用域
                //这里是在一个 if 语句中定义了变量 color。如果是在 C、C++或 Java 中，color 会在 if 语句执行完毕后被销毁。
                //但在 JavaScript 中，if 语句中的变量声明会将变量添加到当前的执行环境（在这里是全局环境）中。
//	                if(true){
//	                	var color = "blue";
//	                }
//	                console.log(color);
                //对于 JavaScript 来说，由 for 语句创建的变量 i 即使在 for 循环执行结束后，也依旧会存在于循环外部的执行环境中。
//	                for(var i=0;i<10;i++){
//	                     
//	                }
//	                console.log(i);//10

                //1.声明变量
                   	//使用 var 声明的变量会自动被添加到最接近的环境中。
                   	//在函数内部，最接近的环境就是函数的局部环境
                   	//如果初始化变量时没有使用 var 声明，该变量会自动被添加到全局环境。
                //2.查询标识符（标识符是指变量、函数、属性的名字或者函数的参数）
                  	//当在某个环境中为了读取或写入而引用一个标识符时，必须通过搜索来确定该标识符实际代表什么。
					//搜索过程从作用域链的前端开始，向上逐级查询与给定名字匹配的标识符。
					//如果在局部环境中找到了该标识符，搜索过程停止，变量就绪。
					//如果在局部环境中没有找到该变量名，则继续沿作用域链向上搜索。搜索过程将一直追溯到全局环境的变量对象。
					//如果在全局环境中也没有找到这个标识符，则意味着该变量尚未声明。
		</script>
	</body>
</html>
